<?php

require_once 'bootstrap.php';
$conn = Doctrine_Manager::connection(DSN);

class servicio_encryp {

	/**
	 * Ingreso de Administrador
	 * 
	 * @param String oAdministradorVOJSON
	 * @return String
	 */
	function agregarAdministrador($oAdministradorVOJSON) {

		$AdministradorVO = json_decode($oAdministradorVOJSON,true);
		
		$conn = Doctrine_Manager :: connection(DSN);
		$d = Doctrine_Query::create();
		
		$administrador = $d->from('Administrador')->where('usuario = ?', $AdministradorVO['usuario'])->execute();
		
		if ( count( $administrador ) == 1 ) {
			return "Administrador ya existe en la Base de datos.";
		} else {
			$f = new administrador();
			$f->usuario = $AdministradorVO['usuario'];
			$f->clave = $AdministradorVO['clave'];
			$f->save();
		
			$q = Doctrine_Query::create()->from('administrador');
			$as = $q->fetchArray();
			print_r($as);

			$users = $q->execute();
			return "Administrador registrado exitosamente";
	
		}
	}
	
	/**
	 * Generador de Login
	 * 
	 * @param String AdministradorVOJson
	 * @return String token
	 */	
	function generarLogin($AdministradorVOJson) {
		
		$conn = Doctrine_Manager::connection(DSN);
		$q = Doctrine_Query::create();
		
		$AdministradorVO = json_decode($AdministradorVOJson,true);
		
		$q->select('id_adm')
		->from('Administrador')
		->where('usuario = ?', $AdministradorVO['usuario'])
		->andWhere('clave = ?', $AdministradorVO['clave']);
		$users = $q->execute();
				
		if ( count( $users ) == 1 ) {
			date_default_timezone_set('America/Santiago');
			$fecha_inicio = date('Y/m/d h:i:s', time());
			

			do{
				$salir = 0;
				$token = '';
				$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
			    for ($i = 0; $i < 20; $i++) {
			        $token .= $characters[rand(0, strlen($characters) - 1)];
			    }
				

				$t = Doctrine_Query::create()
	    		->select('*')
	    		->from('Login')
	    		->where('token = ?', $token);
	    		
				$login = $t->fetchArray();
		
				foreach ($login as $item){
					if ($item['token']==$token){
						$salir = 1;
					}
				}
			}while($salir == 1);

			$f = new Login();
			$f->token =  $token;
			$f->fecha_inicio = $fecha_inicio;
			$f->log_adm = $users[0]['id_adm'];
			$f->save();

			return $token;
			
		} else {
			return "Usuario/Clave incorrectas";
		}
		
	}
	
	/**
	 * Verificar login vigente. la fecha debe estar con el formato Y/m/d h:i:s
	 * 
	 * @param String token
	 * @return String boolean
	 */
	function verificarLoginVigente($token) {
		
		$conn = Doctrine_Manager :: connection(DSN);
		$t = Doctrine_Query::create();
		
		$t->select('fecha_inicio')
		->from('Login')
		->where('token = ?', $token);
		$fecha_ini = $t->execute();
		
		if ( count( $fecha_ini) == 1 ) {
			
			date_default_timezone_set('America/Santiago');
			$time = strtotime($fecha_ini[0]['fecha_inicio']);
			$fecha_fin = date('Y/m/d h:i:s', strtotime('+5 minutes', $time));
			
			$date = date('Y/m/d h:i:s', time());
			  
			if($date < $fecha_fin){
	   	     	return "true";}
		}
		return "false";
	}
	
	/** 
	 * Encripta en base 64
	 * 
	 * @param string texto
	 * @param string token
	 * @return string 
	 */
	function encriptar($texto, $token) {
		
		if($this->verificarLoginVigente($token)=="false"){
			return "sesion caducada";}
		
		if(empty($texto)){
			return "";
		} else if(strlen($texto) > 140){
			return "Maximo de 140 caracteres sobrepasado";
		} else {

			$conn = Doctrine_Manager::connection(DSN);

			$p = Doctrine_Query::create()
			->select('id_log')
			->from('Login')
			->where('token = ?', $token);
			$users = $p->execute();

			$date = date('Y/m/d h:i:s', time());
			$encry = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5("dublin"), $texto, MCRYPT_MODE_CBC, md5(md5("dublin"))));

			$f = new Encriptacion();
			$f->texto = $texto;	
			$f->encriptacion = $encry;
			$f->fecha = $date;
			$f->enc_log = $users[0]['id_log'];
			$f->save();

			return $encry;
		}

	}
	
	/**
	 * Desencripta en base 64
	 * 
	 * @param string texto
	 * @param string token
	 * @return string 
	 */
	function desencriptar($texto, $token) {
		
		if($this->verificarLoginVigente($token)=="false"){
			return "sesion caducada";}
		
		if(empty($texto)){
			return "";
		} else if(strlen($texto) > 140){
			return "Maximo de 140 caracteres sobrepasado";
		} else {

			$conn = Doctrine_Manager::connection(DSN);

			$p = Doctrine_Query::create()
			->select('id_log')
			->from('Login')
			->where('token = ?', $token);
			$users = $p->execute();

			$date = date('Y/m/d h:i:s', time());
			$encry = rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5("dublin"), base64_decode($texto), MCRYPT_MODE_CBC, md5(md5("dublin"))), "\0");

			$f = new Encriptacion();
			$f->texto = $texto;	
			$f->encriptacion = $encry;
			$f->fecha = $date;
			$f->enc_log = $users[0]['id_log'];
			$f->save();

			return $encry;
		}		
	}
	
	/**
	 * Retorna un listado de objeto de la clase EncriptacionVO
	 * 
	 * @param string token
	 * @return string
	 */
	function mostrarHistorico($token) {
		
		if($this->verificarLoginVigente($token)=="false"){
			return "sesion caducada";}
			
		/*
		$q2 = Doctrine_Query::create()
		->select('log_adm')
		->from('login')
		->where('token = ?',$token)->execute();
		
		$id_usuario = $q2[0]['log_adm'];
		
		$q = Doctrine_Query::create()
		->select('id_enc')
		->from('Encriptacion e')
		->innerJoin('e.enc_log l')
		->innerJoin('l.log_adm a')
		->where('a.id_adm = ?',$id_usuario)->execute();
		
		for($i = 0;$i < sizeof($q);$i++){
			$array[$i]['texto'] = $q[$i]['texto'];
			$array[$i]['encriptacion'] = $q[$i]['encriptacion'];
			$array[$i]['fecha'] = $q[$i]['fecha'];
		}
		*/
		$q = Doctrine_Query::create()
	    		->select('*')
	    		->from('Encriptacion');
	    $registro = $q->fetchArray();	
		
		
		
		
		
		return (json_encode($registro));
		
		
			
	}
}
?>